package com.zuo_book.controller;

import com.zuo_book.common.Result;
import com.zuo_book.dto.JwtTokenDTO;
import com.zuo_book.dto.UserLoginDTO;
import com.zuo_book.dto.UserRegisterDTO;
import com.zuo_book.service.AuthService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

/**
 * 认证控制器
 */
@RestController
@RequestMapping("/auth")
@RequiredArgsConstructor
@Slf4j
public class AuthController {
    
    private final AuthService authService;
    
    /**
     * 用户登录
     * @param loginDTO 登录DTO
     * @return 登录结果
     */
    @PostMapping("/login")
    public Result<JwtTokenDTO> login(@Valid @RequestBody UserLoginDTO loginDTO) {
        log.info("接收到登录请求: 用户名={}", loginDTO.getUsername());
        
        JwtTokenDTO tokenDTO = authService.login(loginDTO);
        
        // 打印令牌信息，但不显示完整令牌（安全考虑）
        String token = tokenDTO.getToken();
        String tokenPreview = token != null && token.length() > 10 ? 
                token.substring(0, 10) + "..." : "null";
        log.info("登录成功，生成令牌: 用户={}, 令牌类型={}, 令牌前缀={}", 
                tokenDTO.getUsername(), tokenDTO.getTokenType(), tokenPreview);
        
        return Result.success(tokenDTO);
    }
    
    /**
     * 用户注册
     * @param registerDTO 注册DTO
     * @return 注册结果
     */
    @PostMapping("/register")
    public Result<Void> register(@Valid @RequestBody UserRegisterDTO registerDTO) {
        authService.register(registerDTO);
        return Result.success("注册成功");
    }
    
    /**
     * 检查用户名是否存在
     * @param username 用户名
     * @return 检查结果
     */
    @GetMapping("/check-username")
    public Result<Boolean> checkUsername(@RequestParam String username) {
        boolean exists = authService.checkUsernameExists(username);
        return Result.success(exists);
    }
    
    /**
     * 检查邮箱是否存在
     * @param email 邮箱
     * @return 检查结果
     */
    @GetMapping("/check-email")
    public Result<Boolean> checkEmail(@RequestParam String email) {
        boolean exists = authService.checkEmailExists(email);
        return Result.success(exists);
    }


} 